﻿/**
        @file   Define.h
        @date   2013/01/02
        @author 임진영(deviak@deviak.com)
        @brief  테트리스 구현에 필요한 각종 유틸리티 함수 및 구조체 모음
*/
#ifndef DEFINE_H_
#define DEFINE_H_

#include <Windows.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

#define Randomize() srand((unsigned)time(NULL))		///< 랜덤 매크로
#define Random(n) (rand() % (n))					///< 랜덤 매크로

#define SAFE_DELETE( p ) { if( p ) { delete ( p ); ( p ) = NULL; } }			///< 메모리 해제 매크로
#define SAFE_DELETE_ARRAY( p ) { if( p ) { delete[] ( p ); ( p ) = NULL; } }	///< 배열 메모리 해제 매크로

using namespace std;

/** 
@struct POSITION
@brief POSITION 구조체
*/
typedef struct tagPos
{
	int x_;		/**< x 좌표 */
	int y_;		/**< y 좌표 */

	tagPos() {}
	tagPos(int x, int y)
		: x_(x),
		y_(y) {}

} POSITION;

/**
@struct CURSOR_TYPE
@brief 키 입력 값
*/
typedef enum 
{ 
	CURSOR_NO = 0,	/**< 커서가 보이지 않는다. r */
	CURSOR_SOLID,	/**< 커서 사이즈 100 */
	CURSOR_NORMAL,	/**< 커서 사이즈 20 */
	CURSOR_TOTAL	/**< 커서 타입 갯 수 */
} CURSOR_TYPE;

/**
@enum DIRECTION
@brief 키 입력 값
*/
typedef enum { 
	LEFT = 75,	/**< LEFT KEY */
	RIGHT=77,	/**< RIGHT KEY */
	UP = 72,	/**< UP KEY */
	DOWN = 80	/**< DOWN KEY */
} DIRECTION;



int Getchcon( const POSITION &p);	///< 화면의 POSITION p의 위치에 있는 문자를 조사한다.
void SetCursorType( const CURSOR_TYPE &c); ///< 커서 타입을 변경 한다.
void MoveCursor( const POSITION &p );	///< 커서의 위치를 변경한다.

void DrawObject( const POSITION &p, const char &text );	///< POSITION p의 위치에 text를 출력한다.
void DrawObject( const POSITION &p, const int &item );	///< POSITION p의 위치에 item을 출력한다.

void WaitAnyKey();	///< 임의의 키 하나가 눌러질 때까지 대기한다.

#endif